/*
		利用冒泡排序模拟实现qsort函数

		夏思成

		2024年3月22日

		西科大15号公寓楼
*/










//nums 待排序数组
//numsSize 待排序数组的大小
//width 数组中每个元素的大小
//int(*compare)(const void*, const void*) 比较函数

//void bubble_sort(void* nums, size_t numsSize, size_t width, int(*compare)(const void*, const void*))
//{
//	int i = 0;
//	for (i = 0; i < numsSize; i++)
//	{
//		int j = 0;
//		for (j = 0; j < numsSize - 1 - i; j++)
//		{
//			//我们可以先将待比较的两个元素强制转换为char*类型，但是这样的话就会改变原来元素的类型
//			//所以我们再给强转之后的结果乘上数组每个元素的大小即width，这样每个指针访问的时候访问的都是原来数组类型的字节个数
//			//例如：待排序数组为int型，转为char*后，如果直接传给比较函数，就会造成数据的截断，因为整型每个元素占四个字节
//			//我们给其乘上width之后，就相当于指针向后走了width个位置，就相当于指向了下一个整型的位置。
//			//但我们知道，比较的时候，要一直往后走进行比较，所以我们可以给width乘上一个j变量，j = 0，相当与第一个整型，j = 1，相当于跳过了一个width的长度，即一个整型，j = 2的时候，相当于跳过了两个整型
//			if (compare((char*)nums + j * width, (char*)nums + (j + 1) * width)>0)
//			{	
//
//
//
//				//交换函数
//				Swap((char*)nums + j * width, (char*)nums + (j + 1) * width, width);
//
//			}
//
//		}
//	}
//
//	
//}

//冒泡排序
//void bubble_sort(void* nums, size_t numsSize,size_t width,int(*compare)(const void *,const void *))
//{
//	//趟数
//	int i = 0;
//	for (i = 0; i < numsSize - 1; i++)
//	{
//		//每一趟需要交换的次数
//		int j = 0;
//		for (j = 0; j < numsSize - i - 1; j++)
//		{
//			//前一个大于后一个就进行交换
//			if (compare((char*)nums+j*width,(char*)nums+(j+1)*width))
//			{
//				int tmp = nums[j + 1];
//				nums[j + 1] = nums[j];
//				nums[j] = tmp;
//			}
//		}
//	}
//}


#include <stdio.h>

//比较函数
int compare_int(const char* p1, const char* p2)
{
	return *(int*)p1 - *(int*)p2;
}

//交换函数
void Swap(char* p1, char* p2, size_t width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *p1;
		*p1 = *p2;
		*p2 = tmp;
		p1++;
		p2++;
	}
}

//模拟函数
void bubble_sort(void* nums, size_t numsSize, size_t width, int(*compare)(const void*, const void*))
{
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		int j = 0;
		for (j = 0; j < numsSize - 1 - i; j++)
		{
			
			if (compare((char*)nums + j * width, (char*)nums + (j + 1) * width) > 0)
			{
				Swap((char*)nums + j * width, (char*)nums + (j + 1) * width, width);

			}

		}
	}
}


//打印函数
void Print(int* nums, int numsSize)
{
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		printf("%d ", nums[i]);
	}
}

void test()
{
	int nums[] = { 10,9,8,7,6,5,4,3,2,1 };
	int numsSize = sizeof(nums) / sizeof(nums[0]);
	bubble_sort(nums, numsSize,sizeof(nums[0]),compare_int);
	Print(nums, numsSize);
}

int main()
{

	//模拟qsort函数
	test();
}